package com.example.java_gobang.api.controller;

import com.example.java_gobang.model.User;
import com.example.java_gobang.model.UserMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@Slf4j
@RestController
public class UserAPI {

    @Resource
    private UserMapper userMapper;

    /**
     * 用户登录接口
     * @param username 用户名
     * @param password 密码
     * @param request HTTP 请求对象
     * @return 返回登录的用户信息或一个空的 User 对象表示登录失败
     */
    @PostMapping("/login")
    @ResponseBody
    public Object login(String username, String password, HttpServletRequest request) {
        // 通过用户名查询用户信息
        User user = userMapper.selectByName(username);
        log.info("[login] userName:{}", username);
        // 检查用户是否存在以及密码是否匹配
        if (user == null || !user.getPassword().equals(password)) {
            log.info("登录失败！");
            return new User(); // 返回一个空的 User 对象表示登录失败
        }
        // 获取会话，如果不存在则创建一个新的会话
        HttpSession session = request.getSession(true);
        // 将用户信息存储在会话中
        session.setAttribute("user", user);
        return user; // 返回用户信息
    }

    /**
     * 用户注册接口
     * @param username 用户名
     * @param password 密码
     * @return 返回注册的用户信息或一个空的 User 对象表示注册失败
     */
    @PostMapping("/register")
    @ResponseBody
    public Object register(String username, String password) {
        try {
            // 创建一个新的用户对象并设置用户名和密码
            User user = new User();
            user.setUsername(username);
            user.setPassword(password);
            // 插入用户信息到数据库中
            userMapper.insertUser(user);
            return user; // 返回注册的用户信息
        } catch (org.springframework.dao.DuplicateKeyException e) {
            // 处理重复键异常，即用户名已经存在
             return new User(); // 返回一个空的 User 对象表示注册失败
        }
    }

    /**
     * 获取当前登录用户信息的接口
     * @param request HTTP 请求对象
     * @return 返回当前会话中的用户信息或一个空的 User 对象表示没有用户登录
     */
    @GetMapping("/userInfo")
    @ResponseBody
    public Object getUserInfo(HttpServletRequest request) {
        try {
            // 获取当前会话，如果不存在则返回 null
            HttpSession session = request.getSession(false);
            // 从会话中获取用户信息
            User user = (User) session.getAttribute("user");
            User newUser = userMapper.selectByName(user.getUsername());
            return newUser; // 返回用户信息
        } catch (NullPointerException e) {
            // 处理 session 空指针异常，即没有用户登录
            return new User(); // 返回一个空的 User 对象表示没有用户登录
        }
    }
}
